package com.songlanyun.modules.user.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.songlanyun.common.drive.RootEntity;
import com.songlanyun.common.utils.Constant;
import com.songlanyun.common.utils.SpringContextUtils;
import com.songlanyun.modules.user.service.SysRoleService;
import lombok.Data;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.nustaq.serialization.coders.JSONAsString;

import java.math.BigDecimal;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 系统用户
 *
 * @author Mark
 * @email sunlightcs@gmail.com
 * @date 2020-11-03 17:47:15
 */
@Data
@TableName("sys_user")
public class SysUserEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     *
     */
    @TableId
    private Long userId;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
    /**
     * 盐
     */
    private String salt;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 手机号
     */
    private String mobile;
    /**
     * 状态  0：禁用   1：正常
     */
    private Integer status;
    /**
     * 创建者ID
     */
    private Long createUserId;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * 身份证号
     */
    private String card;
    /**
     * 性别(0男 1女)
     */
    private Integer gender;
    /**
     * 国家
     */
    private String country;
    /**
     * 省份
     */
    private String province;
    /**
     * 城市
     */
    private String city;
    /**
     * 默认收货地址
     */
    private Integer addressId;
    /**
     * 是否删除
     */
    private Integer isDelete;
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    /**
     * 头像地址
     */
    private String avatarUrl;
    /**
     * 用户昵称
     */
    private String nickName;
    /**
     * 推荐人id
     */
    private Integer referee;
    /**
     * 0--系统用户 1--app用户
     */
    private Integer type;
    /**
     * 生日
     */
    private Date birthDay;
    /**
     * 是否缴费
     */
    private Integer proxyType;
    /**
     * 0正常 1异常
     */
    private String abnormalState;
    /**
     * 提现限额
     */
    private BigDecimal withdrawalLimit;
    /**
     * 版本信息
     */
    private Long version;
    /**
     * 真实姓名
     */
    private String realName;

    /**
     * 角色ID列表
     */
    @TableField(exist = false)
    private List<Long> roleIdList;

    /**
     * 角色类型
     * * 角色类型
     * 1：平台管理员角色
     * 2：平台商家管理员角色
     * 3：加盟商家管理员角色
     * 0：系统管理员角色
     */
    @TableField(exist = false)
    private Integer roleType;

   //加载角色类型
    public void loadRoleType() {
        if (userId.equals(Constant.SUPER_ADMIN)) {
            //如果是超级管理员，则角色类型为0
            this.roleType = 0;
        } else {
            //根据用户id获取角色类型
            this.roleType = ((SysRoleService) SpringContextUtils.getBean("sysRoleService")).getRoleTypeByUserId(this.userId);
        }

    }

    @TableField(exist = false)
    private String roleName;

    //根据用户id加载角色名称
    public void loadRoleName() {
        if (userId.equals(Constant.SUPER_ADMIN)) {
            this.roleName = "超级管理员";
        } else {
            this.roleName = ((SysRoleService) SpringContextUtils.getBean("sysRoleService")).getRoleNameByUserId(this.userId);
        }
    }

    /**
     * 是否是商家管理员
     */
    private Boolean isShop;

    /**
     * 是否是区域代理
     */
    private Boolean isAreaAgent;


    /**
     * 给密码加密
     */
    public void passwordEn(String password) {
        //sha256加密
        String salt = RandomStringUtils.randomAlphanumeric(20);
        String pass = new Sha256Hash(password, salt).toHex();
        this.setSalt(salt);//盐
        this.setPassword(pass);//密码
    }
}
